package com.yangfan.design_pattern.singleton_pattern;

/**
 * @description: 单例模式
 * @author: yangfan
 * @date: Created in 2020/2/5 0005 9:50
 * @modified By:
 */
public class SingletonObject {


//=======================================================================================


    /**
     * 恶汉单例模式
     * 缺点不能懒加载
     */

//    private static final SingletonObject instance = new SingletonObject();
//
//    private SingletonObject(){
//        //empty
//    }
//
//    public SingletonObject getInstance(){
//        return instance;
//    }


//=======================================================================================


    /**
     * 懒加载模式但有多线程安全问题 多线程情况下 实例有可能是 1+个
     */

//    private static SingletonObject instance;
//
//    private SingletonObject(){
//        //empty
//    }
//
//    public SingletonObject getInstance(){
//
//        if(instance == null)
//
//            instance = new SingletonObject();
//
//        return this.instance;
//
//    }


//=======================================================================================


    /**
     * 加锁 影响效率
     * 第一个线程如果是写操作，第二个线程就是读操作，
     * 第二个线程读操作 不应该被 阻塞
     */
//    private static SingletonObject instance;
//
//    private SingletonObject(){
//        //empty
//    }
//
//    public synchronized SingletonObject getInstance(){
//
//        if(instance == null)
//
//            instance = new SingletonObject();
//
//        return this.instance;
//
//    }


//=======================================================================================

    /**
     * 双重检查 模式
     * JVM 对性能优化 有可能会出现空指针
     */
//    private static SingletonObject instance;
//
//    private SingletonObject() {
//        //empty
//    }
//
//    public SingletonObject getInstance() {
//
//        if (instance == null)
//
//            synchronized (this){
//
//                if(instance == null){
//
//                    instance = new SingletonObject();
//
//                }
//
//            }
//
//        return this.instance;
//
//    }

//=======================================================================================

    /**
     * 最终版本 没任何问题
     * volatile 关键字 内存可见性 , 还能禁止 JVM 对性能优化
     */

//    private static volatile SingletonObject instance;
//
//    private SingletonObject() {
//        //empty
//    }
//
//    public SingletonObject getInstance() {
//
//        if (instance == null)
//
//            synchronized (this) {
//
//                if (instance == null) {
//
//                    instance = new SingletonObject();
//
//                }
//
//            }
//
//        return this.instance;
//
//    }


//=======================================================================================

    /**
     * 最优雅的实现单例模式
     * 推荐使用的模式
     */

    private SingletonObject() {
        //empty
    }

    private static class InstanceHolder{
        private static final SingletonObject INSTANCE = new SingletonObject();
    }


    public static SingletonObject getInstance(){
        return InstanceHolder.INSTANCE;
    }





}
